package com.agile.leetcode.easy.rotatedDigits;

import java.util.HashMap;
import java.util.Map;

/**
 * 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后，我们仍可以得到一个有效的，且和 X 不同的数。要求每位数字都要被旋转。
 * <p>
 * 如果一个数的每位数字被旋转以后仍然还是一个数字， 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己；2 和 5 可以互相旋转成对方（在这种情况下，它们以不同的方向旋转，换句话说，2 和 5 互为镜像）；6 和 9 同理，除了这些以外其他的数字旋转以后都不再是有效的数字。
 * <p>
 * 现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数？
 * <p>
 * <p>
 * <p>
 * 示例：
 * <p>
 * 输入: 10
 * 输出: 4
 * 解释:
 * 在[1, 10]中有四个好数： 2, 5, 6, 9。
 * 注意 1 和 10 不是好数, 因为他们在旋转之后不变。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/rotated-digits
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @Author KD
 * @Date 2021/3/11 15:07
 */
public class RotatedDigits {
    public static void main(String[] args) {
        RotatedDigits rotatedDigits = new RotatedDigits();
        int i = rotatedDigits.rotatedDigits(857);
        System.out.println(i);
    }

    public int rotatedDigits(int N) {
        // 创建旋转数字集合
        Map<Integer, Integer> map = new HashMap<>(16);
        map.put(2, 5);
        map.put(5, 2);
        map.put(6, 9);
        map.put(9, 6);
        map.put(0, 0);
        map.put(1, 1);
        map.put(8, 8);
        // 计数器
        int j = 0;
        int result = 0;
        // 循环
        for (int i = 0; i <= N; i++) {
            int temp = i;
            int n = 1;
            while (temp != 0) {
                // 拿到余数
                int mod = temp % 10;
                temp = temp / 10;
                if (!map.containsKey(mod)) {
                    result = 0;
                    break;
                } else {
                    // 拿到对应的数
                    Integer integer = map.get(mod);
                    result = result + integer * n;
                    n = n * 10;
                }
            }
            if (result != 0 && result != i) {
                j++;
            }
            // 重置
            result = 0;
        }
        return j;
    }
}
